home *** CD-ROM | disk | FTP | other *** search
/ Mac Easy 2010 May / Mac Life Ubuntu.iso / casper / filesystem.squashfs / usr / src / linux-headers-2.6.28-15 / include / linux / splice.h < prev    next >
Encoding:
C/C++ Source or Header  |  2009-09-09  |  2.4 KB  |  81 lines

  1. /*
  2.  * Function declerations and data structures related to the splice
  3.  * implementation.
  4.  *
  5.  * Copyright (C) 2007 Jens Axboe <jens.axboe@oracle.com>
  6.  *
  7.  */
  8. #ifndef SPLICE_H
  9. #define SPLICE_H
  10.  
  11. #include <linux/pipe_fs_i.h>
  12.  
  13. /*
  14.  * splice is tied to pipes as a transport (at least for now), so we'll just
  15.  * add the splice flags here.
  16.  */
  17. #define SPLICE_F_MOVE    (0x01)    /* move pages instead of copying */
  18. #define SPLICE_F_NONBLOCK (0x02) /* don't block on the pipe splicing (but */
  19.                  /* we may still block on the fd we splice */
  20.                  /* from/to, of course */
  21. #define SPLICE_F_MORE    (0x04)    /* expect more data */
  22. #define SPLICE_F_GIFT    (0x08)    /* pages passed in are a gift */
  23.  
  24. /*
  25.  * Passed to the actors
  26.  */
  27. struct splice_desc {
  28.     unsigned int len, total_len;    /* current and remaining length */
  29.     unsigned int flags;        /* splice flags */
  30.     /*
  31.      * actor() private data
  32.      */
  33.     union {
  34.         void __user *userptr;    /* memory to write to */
  35.         struct file *file;    /* file to read/write */
  36.         void *data;        /* cookie */
  37.     } u;
  38.     loff_t pos;            /* file position */
  39. };
  40.  
  41. struct partial_page {
  42.     unsigned int offset;
  43.     unsigned int len;
  44.     unsigned long private;
  45. };
  46.  
  47. /*
  48.  * Passed to splice_to_pipe
  49.  */
  50. struct splice_pipe_desc {
  51.     struct page **pages;        /* page map */
  52.     struct partial_page *partial;    /* pages[] may not be contig */
  53.     int nr_pages;            /* number of pages in map */
  54.     unsigned int flags;        /* splice flags */
  55.     const struct pipe_buf_operations *ops;/* ops associated with output pipe */
  56.     void (*spd_release)(struct splice_pipe_desc *, unsigned int);
  57. };
  58.  
  59. typedef int (splice_actor)(struct pipe_inode_info *, struct pipe_buffer *,
  60.                struct splice_desc *);
  61. typedef int (splice_direct_actor)(struct pipe_inode_info *,
  62.                   struct splice_desc *);
  63.  
  64. extern ssize_t splice_from_pipe(struct pipe_inode_info *, struct file *,
  65.                 loff_t *, size_t, unsigned int,
  66.                 splice_actor *);
  67. extern ssize_t __splice_from_pipe(struct pipe_inode_info *,
  68.                   struct splice_desc *, splice_actor *);
  69. extern ssize_t splice_to_pipe(struct pipe_inode_info *,
  70.                   struct splice_pipe_desc *);
  71. extern ssize_t splice_direct_to_actor(struct file *, struct splice_desc *,
  72.                       splice_direct_actor *);
  73.  
  74. extern long do_splice_from(struct pipe_inode_info *pipe, struct file *out,
  75.                loff_t *ppos, size_t len, unsigned int flags);
  76. extern long do_splice_to(struct file *in, loff_t *ppos,
  77.              struct pipe_inode_info *pipe, size_t len,
  78.              unsigned int flags);
  79.  
  80. #endif
  81.